// 给你一个长度为 n 的整数数组，请你判断在 最多 改变 1 个元素的情况下，该数组能否变成一个非递减数列。
// 我们是这样定义一个非递减数列的： 对于数组中所有的 i (0 <= i <= n-2)，总满足 nums[i] <= nums[i + 1]。

const checkPossibility = function (nums: number[]): boolean {
    let chance = 1;
    for (let i = 1; i < nums.length; i++) {
        if (nums[i] < nums[i - 1]) {
            if (chance === 0) return false; // 如果没修正机会了就直接返回
            chance--; // 修正机会 - 1
            // 如果i - 1是一个怪异点，改i - 1
            if (i === 1 || nums[i] >= nums[i - 2]) {
                nums[i - 1] = nums[i];
            }
            // 如果 i 是一个怪异点，改i
            else if (nums[i] < nums[i - 2]) {
                nums[i] = nums[i - 1];
            }
        }
    }
    return false;
};

checkPossibility([4, 2, 3]);

// 这道题目是一道看着简单，实际上并不简单的题目
// 直观的解法可能是直接判断是不是只出现了一次下降，但会遇到问题
// 例如[3,4,2,3]，只出现了一次下降，但无法构成非递减数列
// 这道题目实际上要考察一个分类讨论的能力
// 当我们遇到下降数组元素时，可能会出现两种情况
// 即当前数组下降元素是一个怪异点（它可能太小了导致出现了谷底）
// 或者前一个元素是一个怪异点（他可能太大了导致前一个元素出现了谷峰）
// 而谷峰可能是以下两种情况：
// 1. i = 1时 ，那么修改 num[i- 1]，不要动 nums[i] ，因为nums[i]后面的元素存在很多，修改 i = 0是性价比更高的选择
// 2. i > 1 时，我们应该优先考虑nums[i]是否大于或等于nums[i - 2]，如果满足，那么可以判断明显i - 1是一个谷峰
// 而谷底可能是这种情况
// 即nums[i] < nums[i - 2]，说明当前元素跌的太厉害了，修改它是更合理的选择
// 然后设定chance变量扫描数组，机会用完时返回即可。